package com.designPattern.p01singleton;

/**
 * @program: 单例模式
 * @author: luhd
 * @create: 2021-08-23
 */

/**
 *  为什么要使用单例模式：我们可以用单例模式解决类实例生成的个数问题，例如，线程池和数据库连接池，我们可以使用单例模式来保证线程池有且仅有一个
 */
public class ASingleton {
    /**
     * （1）将构造方法私有化，使其不能在类的外部通过new关键字实例化该类对象。
     * （2）在该类内部产生一个唯一的实例化对象，并且将其封装为private static类型。
     * （3）定义一个静态方法返回这个唯一对象。
     *
     * 好记的方法：
     * 1、私有的构造函数
     * 2、私有静态单例变量
     * 3、公有静态getInstance方法
     */

    /**
     * 单例模式主要分为：饿汉式单例、懒汉式单例、登记式单例
     * 单例模式的特点：1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。
     *
     * 饿汉式单例模式：是线程安全的（饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用，以后不再改变，所以天生是线程安全的。）
     * 懒汉式单例模式：它是线程不安全的，并发环境下很可能出现多个Singleton实例
     *      解决办法：1.在getInstance方法上加同步，即synchronized关键字
     *              2.双重检查锁定  判断实例是否为空，为空则创建
     *              3.静态内部类  利用了classloader的机制来保证初始化instance时只有一个线程，所以也是线程安全的，同时没有性能损耗
     */
}
